package dataserver.controller;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
import dataserver.controller.vo.ResponseInfo;
import dataserver.controller.vo.ResultPageInfo;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.data.domain.Page;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 *
 * <p>
 * 说明：公共控制器
 * </p>
 *
 * @author junzhao.wang
 * @date 2019年7月22日
 */
public class BaseController {
	/**
	 * 字符串JSON类型返回
	 *
	 * @param response   响应的response
	 * @param collection 字符串JSON
	 */
	protected void returnCollection(HttpServletResponse response, String collection) throws IOException {
		response.setHeader("content-type", "application/json; charset=utf-8");
		if (collection == null) {
			response.getWriter().print("");
		} else {
			response.getWriter().print(collection);
		}
		response.getWriter().flush();
		response.getWriter().close();
	}

	/**
	 * 字符串JSON类型返回
	 *
	 * @param response   响应的response
	 * @param count 处理数量
	 */
	protected void returnCollection(HttpServletResponse response, int count) throws IOException {
		ResponseInfo successInfo = new ResponseInfo(count,null);
		String targetData = toJson(successInfo);
		returnCollection(response, targetData);
	}

	/**
	 * 数组类型返回
	 *
	 * @param response   响应的response
	 * @param t 数组
	 */
	protected <T> void returnCollection(HttpServletResponse response, List<T> t) throws IOException {
        // 序列化并解析为 JSONArray
        String jsonString = JSON.toJSONString(t);
        JSONArray json = JSONArray.parseArray(jsonString);

        ResponseInfo successInfo = new ResponseInfo(t.size(), json);
        String targetData = toJson(successInfo);
        returnCollection(response, targetData);
    }

	/**
	 * 返回错误信息
	 *
	 * @param response  响应的response
	 * @param exception 错误信息
	 * @throws IOException IO错误信息
	 */
	protected void returnCollection(HttpServletResponse response, Exception exception) throws IOException {
		// returnCollection(response, "error：" + exception.getMessage());
		System.out.println(exception.getMessage());
		ResponseInfo errorInfo = buildException(exception);
		String targetData = toJson(errorInfo);
		returnCollection(response, targetData);
	}

	protected ResponseInfo buildException(Exception exception) {
		ResponseInfo errorInfo = null;
		if (exception instanceof DataIntegrityViolationException) {
			errorInfo = new ResponseInfo("违反数据完整性校验，操作失败！");
		} else {
			errorInfo = new ResponseInfo(exception.getMessage());
		}
		return errorInfo;
	}

	/**
	 * 集合转换为JSON对象
	 *
	 * @param <T> 转换的对象
	 * @param t   对象集合
	 * @return JSON数据
	 */
	public <T> String list2Json(List<T> t,boolean... transDate) {
		JSONArray json;
		if(transDate.length != 0 && transDate[0]){
			json = (JSONArray) JSONArray.parseArray(JSON.toJSONString(t));
		}else{
			json = (JSONArray) JSONArray.parseArray(JSON.toJSONString(t));
		}
		return toJson(json);
	}

	/**
	 * JSON对象转换为集合
	 *
	 * @param JSON数据
	 * @return t   对象集合
	 */
	public List<Map<String, Object>> json2List(String json) {
		List<Map<String, Object>> vendors = (List<Map<String, Object>>) JSON.parse(json);
		return vendors;
	}

	/**
	 * 对象转JSON
	 *
	 * @param <T> 转换的对象
	 * @param t   单对象
	 * @return JSON数据
	 */
	public <T> String object2Json(T t) {
        JSONObject json = (JSONObject) JSON.toJSON(t);
		return toJson(json);
	}

	/**
	 * 转换分页对象
	 *
	 * @param <T> 分页的对象
	 * @param t   数据集合
	 * @return JOSN数据
	 */
	protected <T> String getPage(Page<T> t) {
		JSONObject json = new JSONObject();
		if (t != null) {
			json.put("total", t.getTotalElements());
			json.put("rows", t.getContent());
		}
		return toJson(json);
	}

    /**
     * 转换分页对象
     *
     * @param <T>分页的对象
     * @param retCode  返回状态编码
     * @param retInfo  返回状态信息
     * @param t        数据集合
     * @return JOSN数据
     */
    protected <T> String getPageData(int retCode, String retInfo, Page<T> t) {
        ResultPageInfo<T> resultInfo = new ResultPageInfo<T>(retCode, retInfo, t);
        return toJson(resultInfo);
    }

    /**
     * 转换分页对象
     *
     * @param <T> 分页的对象
     * @param t   数据集合
     * @return JOSN数据
     */
    protected <T> String getPageData(Page<T> t) {
        ResultPageInfo<T> resultInfo = new ResultPageInfo<T>(t);
        return toJson(resultInfo);
    }

	/**
	 * 转换JSON对象
	 *
	 * @param <T>
	 * @param t
	 * @return
	 */
	protected <T> String toJson(T t) {
		return JSON.toJSONString(t,
                JSONWriter.Feature.WriteNullBooleanAsFalse, // 空Boolean转false
                JSONWriter.Feature.WriteMapNullValue,
                JSONWriter.Feature.PrettyFormat // 格式化输出
                );
	}
	/**
	 * 模糊查询拼装
	 *
	 * @param param 模糊对象
	 * @return
	 */
	protected String likeParam(String param) {
		return "%" + param + "%";
	}

}
